package com.sun.designpatternsdemo.decorator

import android.os.Bundle
import android.util.Log
import com.sun.designpatternsdemo.R
import com.sun.designpatternsdemo.app.AppConstant
import com.sun.designpatternsdemo.app.EMTagHandler
import com.sun.designpatternsdemo.base.BaseActivity
import com.sun.designpatternsdemo.databinding.ActivityDecoratorBinding
/**
 * 版权：xx公司 版权所有
 * @author sun
 * 版本：1.0
 * 创建日期：${DATE} ${TIME}
 * 描述：${DATA}
 * * 装饰者模式:
 * 装饰者模式：若要扩展功能，装饰者提供了比集成更有弹性的替代方案，动态地将责任附加到对象上。
 * 先简单描述下装饰者模式发挥作用的地方，当我们设计好了一个类，我们需要给这个类添加一些辅助的功能，
 * 并且不希望改变这个类的代码，这时候就是装饰者模式大展雄威的时候了。
 * 这里还体现了一个原则：类应该对扩展开放，对修改关闭。
 * eg:
 * 1、武器（攻击力20） 、戒指（攻击力5）、护腕（攻击力5）、鞋子（攻击力5）
 * 2、蓝宝石（攻击力5/颗）、黄宝石（攻击力10/颗）、红宝石（攻击力15/颗）
 * 3、每个装备可以随意镶嵌3颗
 */
class DecoratorActivity : BaseActivity<ActivityDecoratorBinding>() {

    override fun layoutId(): Int {
        return R.layout.activity_decorator
    }

    override fun initView(savedInstanceState: Bundle?) {
        title = "装饰者模式"
        mDataBind.apply {
            tvDefine.text = EMTagHandler.fromHtml(AppConstant.DECORATOR_DEFINE)
            btDemo1.text = "一个镶嵌2颗红宝石,1颗蓝宝石的靴子"
            btDemo2.text = "一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的戒指"
            btDemo1.setOnClickListener {
                Log.e("---", "一个镶嵌2颗红宝石,1颗蓝宝石的靴子: ")
                val iEquip = RedGemDecorator(RedGemDecorator(BlueGemDecorator(ShoeEquip())))
                Log.e("---", "攻击力:" + iEquip.caculateAttack())
                Log.e("---", "描述语:" + iEquip.description())
            }
            btDemo2.setOnClickListener {
                Log.e("---", "一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的戒指: ")
                val iEquip = RedGemDecorator(BlueGemDecorator(YellowGemDecorator(RingEquip())))
                Log.e("---", "攻击力:" + iEquip.caculateAttack())
                Log.e("---", "描述语:" + iEquip.description())
            }
        }
    }
}